BackGroundWorker是個滿簡單的多執行緒元件,很多人會透過RunWorkerCompleted事件再度呼叫RunWorkerAsync()方法讓它不斷循環,頭痛的是,如果要中斷一個這種的BackGroundWorker該怎麼做?
這問題在我剛開始寫.Net程式時曾經困擾過我一陣子,第一:那時我還看不懂MSDN文件庫、第二:我手上的書對這個的描述幾乎都是錯的。
說穿了這個程序很簡單,共有四個步驟:
(1)
將BackgroundWorker的WorkerSupportsCancellation屬性設為True,
表示此BackgroundWorker物件可以支援取消作業的動作﹝也就是使它可以呼叫CancelAsync方法﹞。
(2)
在某一個特定事件中呼叫BackgroundWorker的CancelAsync方法﹝例如寫在某一個Button物件的Click事件中﹞。
(3)
在DoWork事件的程序中必要的位置建立檢查CancellationPending 屬性值的程序
﹝當BackgroundWorker的CancelAsync方法被呼叫後,這個值將會成為True﹞,
並在此一屬性值轉為True時將傳入DoWork事件的DoWorkEventArgs的Cancel屬性值設為True。
(4)
在BackgroundWorker的RunWorkerCompleted事件中檢查傳入此事件的RunWorkerCompletedEventArgs的Cancelled屬性值
﹝這個值就是由(3)所描述的System.ComponentModel.DoWorkEventArgs的Cancel屬性值傳進來的﹞,
當這個值為Fasle則呼叫RunWorkerAsync方法重新引發DoWork事件重新開始一個新的背景執行緒;若為True則不再繼續。